#include <my_header.h>
static int dirs = 0;
static int files = 0;

void DFS_print(char* dirpath, int width) {
    DIR* dirp = opendir("."); // 直接打开当前目录
    ERROR_CHECK(dirp, NULL, "opendir"); // 检查目录是否成功打开

    struct dirent* pdirent;
    while ((pdirent = readdir(dirp)) != NULL) { // 循环读取目录项
        // 跳过 "." 和 ".." 这两个特殊目录
        if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0) {
            continue;
        }

        // 打印前缀和缩进，构建树形结构的视觉效果
        printf("└");
        for (int i = 1; i < width; ++i) {
            printf("─");
        }
        printf("%s\n", pdirent->d_name); // 打印当前文件或目录的名称

        // 如果是当前正在处理的文件是目录文件，那么就递归深入该目录遍历
        if (pdirent->d_type == DT_DIR) { // DT_DIR 表示目录文件
            dirs++;
            int ret = chdir(pdirent->d_name); // 改变工作目录到当前遍历的目录
            ERROR_CHECK(ret, -1, "chdir"); // 检查目录是否成功切换
            DFS_print(".", width + 4); // 工作目录切换成功后，就递归的对当前目录进行深入遍历
            ret = chdir(".."); // 当前目录已经遍历完了，那就返回上一级目录
            ERROR_CHECK(ret, -1, "chdir"); // 检查是否成功返回
        } else {
            files++;
        }
    }
    closedir(dirp); // 完成目录遍历后关闭目录
}

/* Usage: ./08_mytree pathname */
int main(int argc, char* argv[]) {
    ARGS_CHECK(argc, 2);
    printf("%s\n", argv[1]); // 打印根目录名称
    int ret = chdir(argv[1]); // 改变到提供的根目录
    ERROR_CHECK(ret, -1, "chdir");
    DFS_print(".", 4); // 从根目录开始深度优先遍历打印目录树, 初始打印4个横杠
    printf("\n%d directories, %d files\n", dirs, files);
    return 0;
}
